package com.parking.order.service;

import com.parking.common.core.model.PageInfo;
import com.parking.order.model.EntranceInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.parking.order.model.dto.AddEnterInfoDto;
import com.parking.order.model.dto.AddOutInfoDto;
import com.parking.order.model.param.AddEnterInfoParam;
import com.parking.order.model.param.AddOutInfoParam;
import com.parking.order.model.param.FindEntranceByOrderNumParam;
import com.parking.order.model.param.FindEntranceParam;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 吴彦祖
 * @since 2023年11月28日
 */
public interface IEntranceInfoService extends IService<EntranceInfo> {
    /**
     * 添加入场信息
     * 参数 AddEnterInfoForm
     *      stallInfoId 车位信息Id
     *      carPlate 车牌号
     *      entranceImg 入场图片
     *      entranceEnterTime 入场时间
     *      certifiedId 物业Id
     *
     * 返回 AddEnterInfoDto
     *      entranceInfoId 出入场信息Id
     *      userInfoId     用户信息Id
     *      userInfoName   用户名称
     *      certifiedInfoId 物业信息Id
     *      certifiedInfoName 物业名称
     *      certifiedInfoTel 物业电话
     *      certifiedInfoAddress 物业地址
     *      stallInfoId     车位信息Id
     *      stallInfo         车位号
     *      entranceInfoPlate 入场车牌号
     *      stallType        普通车位 0普通车位 1充电车位
     *      entranceEnterTime 入场时间
     *      entranceImg       入场图片
     *      orderInfoId       订单Id
     *      orderInfoNum      订单编号
     *      extraInfo         额外信息 提醒是否是该订单的第一次进入
     * */
    AddEnterInfoDto addEnterInfo(AddEnterInfoParam param) throws Exception;
    /**
     * 添加出场信息
     * 参数 AddOutInfoForm
     *      stallInfoId 车位信息Id
     *      carPlate 车牌号
     *      entranceOutTime 出场时间
     *      certifiedId 物业Id
     *
     * 返回 AddOutInfoDto
     *      entranceInfoId 出入场信息Id
     *      userInfoId     用户信息Id
     *      userInfoName   用户名称
     *      certifiedInfoId 物业信息Id
     *      certifiedInfoName 物业名称
     *      certifiedInfoTel 物业电话
     *      certifiedInfoAddress 物业地址
     *      stallInfoId     车位信息Id
     *      entranceInfoPlate 入场车牌号
     *      stallInfo         车位号
     *      stallType        普通车位 0普通车位 1充电车位
     *      entranceEnterTime 入场时间
     *      entranceImg       入场图片
     *      entranceOutTime   出场时间
     *      orderInfoId       订单Id
     *      orderInfoNum      订单编号
     *      extraInfo         额外信息 提醒是否超时
     * */
    AddOutInfoDto addOutInfo(AddOutInfoParam param) throws Exception;

    /**
     * 根据订单编号查询进出场信息
     * 参数 出租客Id renterId
     *     用户Id  userId
     *      平台Id platformId
     *     订单编号 orderInfoNum
     * 返回 List<String> 入场时间 - 出场时间
     * */
    List<String> findEntranceByOrderNum(FindEntranceByOrderNumParam param) throws Exception;

    /**
     * 判断平台Id 用户Id 出租客Id 是否合法
     *     以及与订单编号orderInfoNum是否契合
     * 参数 出租客Id renterId
     *     用户Id  userId
     *      平台Id platformId
     *     订单编号 orderInfoNum
     * */
    void checkUserPlatformRentersForOrderInfoNum(Integer userId,Integer platformId,Integer rentersId,String orderInfoNum) throws Exception;
    /**
     * 物业查询进出场信息日志
     * 参数：certifiedId 物业账号Id
     *      pageNum 页数
     *      pageSize 每页大小
     *      startTime 开始时间
     *      endTime   结束时间
     *      stallInfo 车位号
     *      orderInfoNum 订单编号
     *      entranceInfoPlate 车牌号
     *      isOut 是否出场 0已出场 1未出场
     *
     * 返回 entranceInfoId 出入场信息Id
     *      orderInfoNum 订单编号
     *      userInfoId 用户信息Id
     *      userInfoName 用户名称
     *      userInfoTel 用户电话
     *      entranceInfoPlate 车牌号
     *       stallInfoId 车位信息Id
     *       stallInfo 车位号
     *       stallType 车位类型 0普通车位 1充电车位
     *       entranceEnterTime 入场图片
     *       entranceOutTime 出场图片
     *       entranceImg 入场图片
     * */
    PageInfo findEntrance(FindEntranceParam param) throws Exception;
}
